// src/utils/websocket.js
import { wsBaseURL } from '@/utils/request'; // 基础地址（ws://tfadmin.hzgdwl.com）

// 存储所有 WebSocket 实例：key=接口路径（如 '/ws/iot/realtime'），value=ws实例
const wsInstances = new Map();

/**
 * 初始化 WebSocket 连接
 * @param {string} path - 接口路径（如 '/ws/iot/realtime'、'/ws/energy/storage'）
 * @param {function} onMessage - 消息接收回调（data, path）
 * @param {function} onStatusChange - 连接状态变更回调（isConnected, path）
 * @returns {WebSocket|null} - WebSocket 实例
 */
export const initWS = (path, onMessage, onStatusChange) => {
  // 完整连接地址：基础地址 + 接口路径
  const fullURL = `${wsBaseURL}${path}`;

  // 若已存在连接，直接返回实例
  if (wsInstances.has(path)) {
    const existingWS = wsInstances.get(path);
    if (existingWS.readyState === WebSocket.OPEN) {
      onStatusChange?.(true, path);
      return existingWS;
    }
  }

  // 创建新连接
  const ws = new WebSocket(fullURL);

  // 连接成功
  ws.onopen = () => {
    console.log(`WebSocket 连接成功：${fullURL}`);
    wsInstances.set(path, ws);
    onStatusChange?.(true, path);

    // 可选：发送通用订阅指令（根据后端要求调整）
    ws.send(JSON.stringify({
      action: 'subscribe',
      timestamp: Date.now()
    }));
  };

  // 接收消息
  ws.onmessage = (event) => {
    console.log(`WebSocket 接收消息: ${event}`);

    try {
      const data = JSON.parse(event.data);
      onMessage?.(data, path); // 回调传入数据和接口路径（区分不同接口）
    } catch (error) {
      console.error(`WebSocket[${path}] 数据解析失败：`, error, '原始数据：', event.data);
    }
  };

  // 连接错误
  ws.onerror = (error) => {
    console.error(`WebSocket[${path}] 错误：`, error);
    onStatusChange?.(false, path);
  };

  // 连接关闭（自动重连）
  ws.onclose = (event) => {
    console.log(`WebSocket[${path}] 关闭：`, event.code, event.reason);
    wsInstances.delete(path);
    onStatusChange?.(false, path);

    // 非主动关闭（code≠1000），1秒后自动重连
    if (event.code !== 1000) {
      setTimeout(() => {
        initWS(path, onMessage, onStatusChange);
      }, 1000);
    }
  };

  return ws;
};

/**
 * 发送消息到指定 WebSocket 接口
 * @param {string} path - 接口路径
 * @param {object} data - 发送的数据
 */
export const sendWSMessage = (path, data) => {
  const ws = wsInstances.get(path);
  if (ws && ws.readyState === WebSocket.OPEN) {
    ws.send(JSON.stringify(data));
  } else {
    console.error(`WebSocket[${path}] 未连接或已关闭`);
  }
};

/**
 * 关闭指定 WebSocket 连接
 * @param {string} path - 接口路径（不传则关闭所有）
 */
export const closeWS = (path) => {
  if (path) {
    // 关闭单个连接
    const ws = wsInstances.get(path);
    if (ws) {
      ws.close(1000, '主动关闭');
      wsInstances.delete(path);
    }
  } else {
    // 关闭所有连接
    wsInstances.forEach((ws, key) => {
      ws.close(1000, '主动关闭所有');
    });
    wsInstances.clear();
  }
};

/**
 * 获取指定接口的 WebSocket 连接状态
 * @param {string} path - 接口路径
 * @returns {boolean} - 是否连接成功
 */
export const getWSStatus = (path) => {
  const ws = wsInstances.get(path);
  return !!ws && ws.readyState === WebSocket.OPEN;
};